﻿namespace Charades.Web.Hubs
{
	using System.Linq;
	using System.Web;
	using System.Web.Helpers;

	using Charades.Web.Server.Room;

	public class GameHub : BaseHub
	{
		/// <summary>
		/// Инициализация пользователя
		/// </summary>
		/// <param name="data">Данные авторизации</param>
		/// <returns>Сущьность полльзователя</returns>
		public object InitializeUser(string data)
		{
			var formData = Json.Decode<dynamic>(data);
			if (formData == null || string.IsNullOrEmpty(formData["name"]))
			{
				return null;
			}
			var name = formData["name"].Replace(" ", string.Empty);
			return Game.InitializeUser(Context.ConnectionId, HttpUtility.HtmlEncode(name));
		}

		/// <summary>
		/// Возвращает список пользователей
		/// </summary>
		/// <returns></returns>
		public object GetUsers()
		{
			return Game.UserHandler.GetUsers();
		}

		/// <summary>
		/// Возвращает колличество пользователей
		/// </summary>
		/// <returns></returns>
		public object GetUsersCount()
		{
			return Game.UserHandler.GetUsersCount();
		}

		/// <summary>
		/// Поиск комнаты для пользователя
		/// </summary>
		public void FindRoom()
		{
			var room = Game.RoomHandler.GetRoom(Context.ConnectionId);
			if (Game.UserHandler.UserExists(Context.ConnectionId) && room == null || (room != null && room.Status == RoomStatus.Finished))
			{
				Game.FindRoom(Context.ConnectionId);
			}
		}

		/// <summary>
		/// Входящие соообщение
		/// </summary>
		/// <param name="msg">Сообщение</param>
		public void SendMessage(string msg)
		{
			if (!string.IsNullOrEmpty(msg) && Game.UserHandler.UserExists(Context.ConnectionId) && !Game.RoomHandler.UserCanDraw(Context.ConnectionId))
			{
				Game.SendMessage(Context.ConnectionId, HttpUtility.HtmlEncode(new string(msg.Take(140).ToArray())));
			}
		}

		/// <summary>
		/// Рисование
		/// </summary>
		/// <param name="data">Данные рисования</param>
		public void Draw(string data)
		{
			if (!string.IsNullOrEmpty(data) && Game.UserHandler.UserExists(Context.ConnectionId) && Game.RoomHandler.UserCanDraw(Context.ConnectionId))
			{
				var user = Game.UserHandler.GetUser(Context.ConnectionId);
				Clients.Group(user.RoomId, Context.ConnectionId).draw(data);
			}
		}

		/// <summary>
		/// Начать раунд
		/// </summary>
		/// <param name="wordId">ID слова</param>
		public void StartRound(int wordId)
		{
			if (Game.UserHandler.UserExists(Context.ConnectionId))
			{
				Game.StartRound(Context.ConnectionId, wordId);
			}
		}

		/// <summary>
		/// Раздает ссылку для картинки
		/// </summary>
		/// <param name="url">Ссылка на картинку</param>
		public void ShareImage(string url)
		{
			if (Game.UserHandler.UserExists(Context.ConnectionId))
			{
				var room = Game.RoomHandler.GetRoom(Context.ConnectionId);
				Clients.Group(room.Id).imageUrl(new { url = url });
			}
		}
	}
}